<?php

namespace App\Console\Commands;

use Goutte\Client as GoutteClient;
use GuzzleHttp\Client as GuzzleClient;
use GuzzleHttp\Pool;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;

class Spider extends Command
{

    protected $signature = 'command:spider {concurrency} {keyWords*}'; //concurrency为并发数  keyWords为查询关键词

    protected $description = 'php spider';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        //
        $concurrency = $this->argument('concurrency');  //并发数
        $keyWords = $this->argument('keyWords');    //查询关键词
//        echo $concurrency;
//        var_dump($keyWords);
//        die;
        $guzzleClent = new GuzzleClient();
        $client = new GoutteClient();
        $client->setClient($guzzleClent);
        $request = function ($total) use ($client,$keyWords){
            foreach ($keyWords as $key){
               // $url='https://laravel-china.org/search?q='.$key;
                $url='https://laravel-china.org';
                yield function () use($client,$url){
                    return $client->request('GET',$url);
                };
            }
        };
        $pool = new Pool($guzzleClent,$request(count($keyWords)),[
            'concurrency' => $concurrency,
            'fulfilled' => function ($response, $index) use ($client){
             //  dd($response);
                $response->filter('.media-heading> a')->reduce(function($node) use ($client){
                   // dd(strlen($node->attr('title')));
                    if(strlen($node->attr('title'))>=0) {
                       // dd($node);
                        $title = $node->text();             //文章标题
                      trim($title);
                        $link = $node->attr('href');        //文章链接
                      //  dd($link);
                        $carwler = $client->request('GET',$link);       //进入文章
                        $content=$carwler->filter('.article-content')->first()->text();     //获取内容
                        Storage::disk('local')->put( trim($title),$content);           //储存在本地
                    }
                });
            },
            'rejected' => function ($reason, $index){
                $this->error("Error is ".$reason);
            }
        ]);
        //开始爬取
        $promise = $pool->promise();
        $promise->wait();
    }
}